//+------------------------------------------------------------------+
//|                                                   SymbolInfo.mqh |
//|                             Copyright 2000-2025, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#include <Object.h>

//+------------------------------------------------------------------+
//| 交易品种信息类                                                   |
//| 用途：访问交易品种信息的类                                       |
//|         继承自 CObject 类                                        |
//+------------------------------------------------------------------+
class CSymbolInfo : public CObject
{
protected:
   string            m_name;                       // 交易品种名称
   MqlTick           m_tick;                       // 报价结构
   double            m_point;                      // 点值
   double            m_tick_value;                 // 每点价值
   double            m_tick_value_profit;          // 盈利点值
   double            m_tick_value_loss;            // 亏损点值
   double            m_tick_size;                  // 点大小
   double            m_contract_size;              // 合约大小
   double            m_lots_min;                   // 最小手数
   double            m_lots_max;                   // 最大手数
   double            m_lots_step;                  // 手数步长
   double            m_lots_limit;                 // 手数限制
   double            m_swap_long;                  // 多头隔夜利息
   double            m_swap_short;                 // 空头隔夜利息
   int               m_digits;                     // 小数点位数
   int               m_order_mode;                 // 订单模式
   ENUM_SYMBOL_TRADE_EXECUTION m_trade_execution;  // 交易执行模式
   ENUM_SYMBOL_CALC_MODE m_trade_calcmode;         // 交易计算模式
   ENUM_SYMBOL_TRADE_MODE m_trade_mode;            // 交易模式
   ENUM_SYMBOL_SWAP_MODE m_swap_mode;              // 隔夜利息模式
   ENUM_DAY_OF_WEEK  m_swap3;                      // 三重隔夜利息日
   double            m_margin_initial;             // 初始保证金
   double            m_margin_maintenance;         // 维持保证金
   bool              m_margin_hedged_use_leg;      // 对冲保证金使用大边
   double            m_margin_hedged;              // 对冲保证金
   int               m_trade_time_flags;           // 交易时间标志
   int               m_trade_fill_flags;           // 交易填充标志

public:
   /** 构造函数 */
   CSymbolInfo(void);
   
   /** 析构函数 */
   ~CSymbolInfo(void);
   
   /**
    * 获取交易品种名称
    * @return 交易品种名称
    */
   string            Name(void) const;
   
   /**
    * 设置交易品种名称
    * @param name 交易品种名称
    * @return 成功返回 true，失败返回 false
    */
   bool              Name(const string name);
   
   /**
    * 刷新交易品种信息
    * @return 成功返回 true，失败返回 false
    */
   bool              Refresh(void);
   
   /**
    * 刷新报价信息
    * @return 成功返回 true，失败返回 false
    */
   bool              RefreshRates(void);
   
   /**
    * 检查交易品种是否已选择
    * @return 已选择返回 true，未选择返回 false
    */
   bool              Select(void) const;
   
   /**
    * 选择或取消选择交易品种
    * @param select 是否选择
    * @return 成功返回 true，失败返回 false
    */
   bool              Select(const bool select);
   
   /**
    * 检查交易品种是否已同步
    * @return 已同步返回 true，未同步返回 false
    */
   bool              IsSynchronized(void) const;
   
   /**
    * 获取当前成交量
    * @return 当前成交量
    */
   ulong             Volume(void) const;
   
   /**
    * 获取最高成交量
    * @return 最高成交量
    */
   ulong             VolumeHigh(void) const;
   
   /**
    * 获取最低成交量
    * @return 最低成交量
    */
   ulong             VolumeLow(void) const;
   
   /**
    * 获取点差
    * @return 点差
    */
   int               Spread(void) const;
   
   /**
    * 检查是否为浮动点差
    * @return 是浮动点差返回 true，否则返回 false
    */
   bool              SpreadFloat(void) const;
   
   /**
    * 获取市场深度
    * @return 市场深度
    */
   int               TicksBookDepth(void) const;
   
   /**
    * 获取止损水平
    * @return 止损水平
    */
   int               StopsLevel(void) const;
   
   /**
    * 获取冻结水平
    * @return 冻结水平
    */
   int               FreezeLevel(void) const;
   
   /**
    * 获取当前买价
    * @return 当前买价
    */
   double            Bid(void) const;
   
   /**
    * 获取最高买价
    * @return 最高买价
    */
   double            BidHigh(void) const;
   
   /**
    * 获取最低买价
    * @return 最低买价
    */
   double            BidLow(void) const;
   
   /**
    * 获取当前卖价
    * @return 当前卖价
    */
   double            Ask(void) const;
   
   /**
    * 获取最高卖价
    * @return 最高卖价
    */
   double            AskHigh(void) const;
   
   /**
    * 获取最低卖价
    * @return 最低卖价
    */
   double            AskLow(void) const;
   
   /**
    * 获取最后成交价
    * @return 最后成交价
    */
   double            Last(void) const;
   
   /**
    * 获取最高成交价
    * @return 最高成交价
    */
   double            LastHigh(void) const;
   
   /**
    * 获取最低成交价
    * @return 最低成交价
    */
   double            LastLow(void) const;
   
   /**
    * 获取订单模式
    * @return 订单模式
    */
   int               OrderMode(void) const;
   
   /**
    * 获取交易计算模式
    * @return 交易计算模式枚举值
    */
   ENUM_SYMBOL_CALC_MODE TradeCalcMode(void) const;
   
   /**
    * 获取交易计算模式描述
    * @return 交易计算模式描述字符串
    */
   string            TradeCalcModeDescription(void) const;
   
   /**
    * 获取交易模式
    * @return 交易模式枚举值
    */
   ENUM_SYMBOL_TRADE_MODE TradeMode(void) const;
   
   /**
    * 获取交易模式描述
    * @return 交易模式描述字符串
    */
   string            TradeModeDescription(void) const;
   
   /**
    * 获取交易执行模式
    * @return 交易执行模式枚举值
    */
   ENUM_SYMBOL_TRADE_EXECUTION TradeExecution(void) const;
   
   /**
    * 获取交易执行模式描述
    * @return 交易执行模式描述字符串
    */
   string            TradeExecutionDescription(void) const;
   
   /**
    * 获取隔夜利息模式
    * @return 隔夜利息模式枚举值
    */
   ENUM_SYMBOL_SWAP_MODE SwapMode(void) const;
   
   /**
    * 获取隔夜利息模式描述
    * @return 隔夜利息模式描述字符串
    */
   string            SwapModeDescription(void) const;
   
   /**
    * 获取三重隔夜利息日
    * @return 三重隔夜利息日枚举值
    */
   ENUM_DAY_OF_WEEK  SwapRollover3days(void) const;
   
   /**
    * 获取三重隔夜利息日描述
    * @return 三重隔夜利息日描述字符串
    */
   string            SwapRollover3daysDescription(void) const;
   
   /**
    * 获取开始时间（期货）
    * @return 开始时间
    */
   datetime          StartTime(void) const;
   
   /**
    * 获取到期时间（期货）
    * @return 到期时间
    */
   datetime          ExpirationTime(void) const;
   
   /**
    * 获取初始保证金
    * @return 初始保证金
    */
   double            MarginInitial(void) const;
   
   /**
    * 获取维持保证金
    * @return 维持保证金
    */
   double            MarginMaintenance(void) const;
   
   /**
    * 检查是否使用大边计算对冲保证金
    * @return 使用大边返回 true，否则返回 false
    */
   bool              MarginHedgedUseLeg(void) const;
   
   /**
    * 获取对冲保证金
    * @return 对冲保证金
    */
   double            MarginHedged(void) const;
   
   /**
    * 获取多头保证金（已弃用）
    * @return 0.0
    */
   double            MarginLong(void) const;
   
   /**
    * 获取空头保证金（已弃用）
    * @return 0.0
    */
   double            MarginShort(void) const;
   
   /**
    * 获取限价保证金（已弃用）
    * @return 0.0
    */
   double            MarginLimit(void) const;
   
   /**
    * 获取止损保证金（已弃用）
    * @return 0.0
    */
   double            MarginStop(void) const;
   
   /**
    * 获取止损限价保证金（已弃用）
    * @return 0.0
    */
   double            MarginStopLimit(void) const;
   
   /**
    * 获取交易时间标志
    * @return 交易时间标志
    */
   int               TradeTimeFlags(void) const;
   
   /**
    * 获取交易填充标志
    * @return 交易填充标志
    */
   int               TradeFillFlags(void) const;
   
   /**
    * 获取小数点位数
    * @return 小数点位数
    */
   int               Digits(void) const;
   
   /**
    * 获取点值
    * @return 点值
    */
   double            Point(void) const;
   
   /**
    * 获取每点价值
    * @return 每点价值
    */
   double            TickValue(void) const;
   
   /**
    * 获取盈利点值
    * @return 盈利点值
    */
   double            TickValueProfit(void) const;
   
   /**
    * 获取亏损点值
    * @return 亏损点值
    */
   double            TickValueLoss(void) const;
   
   /**
    * 获取点大小
    * @return 点大小
    */
   double            TickSize(void) const;
   
   /**
    * 获取合约大小
    * @return 合约大小
    */
   double            ContractSize(void) const;
   
   /**
    * 获取最小手数
    * @return 最小手数
    */
   double            LotsMin(void) const;
   
   /**
    * 获取最大手数
    * @return 最大手数
    */
   double            LotsMax(void) const;
   
   /**
    * 获取手数步长
    * @return 手数步长
    */
   double            LotsStep(void) const;
   
   /**
    * 获取手数限制
    * @return 手数限制
    */
   double            LotsLimit(void) const;
   
   /**
    * 获取多头隔夜利息
    * @return 多头隔夜利息
    */
   double            SwapLong(void) const;
   
   /**
    * 获取空头隔夜利息
    * @return 空头隔夜利息
    */
   double            SwapShort(void) const;
   
   /**
    * 获取基础货币
    * @return 基础货币
    */
   string            CurrencyBase(void) const;
   
   /**
    * 获取利润货币
    * @return 利润货币
    */
   string            CurrencyProfit(void) const;
   
   /**
    * 获取保证金货币
    * @return 保证金货币
    */
   string            CurrencyMargin(void) const;
   
   /**
    * 获取银行名称
    * @return 银行名称
    */
   string            Bank(void) const;
   
   /**
    * 获取描述信息
    * @return 描述信息
    */
   string            Description(void) const;
   
   /**
    * 获取路径
    * @return 路径
    */
   string            Path(void) const;
   
   /**
    * 获取交易日交易量
    * @return 交易日交易量
    */
   long              SessionDeals(void) const;
   
   /**
    * 获取交易日买单数量
    * @return 交易日买单数量
    */
   long              SessionBuyOrders(void) const;
   
   /**
    * 获取交易日卖单数量
    * @return 交易日卖单数量
    */
   long              SessionSellOrders(void) const;
   
   /**
    * 获取交易日交易额
    * @return 交易日交易额
    */
   double            SessionTurnover(void) const;
   
   /**
    * 获取交易日利息
    * @return 交易日利息
    */
   double            SessionInterest(void) const;
   
   /**
    * 获取交易日买单交易量
    * @return 交易日买单交易量
    */
   double            SessionBuyOrdersVolume(void) const;
   
   /**
    * 获取交易日卖单交易量
    * @return 交易日卖单交易量
    */
   double            SessionSellOrdersVolume(void) const;
   
   /**
    * 获取交易日开盘价
    * @return 交易日开盘价
    */
   double            SessionOpen(void) const;
   
   /**
    * 获取交易日收盘价
    * @return 交易日收盘价
    */
   double            SessionClose(void) const;
   
   /**
    * 获取交易日平均加权价
    * @return 交易日平均加权价
    */
   double            SessionAW(void) const;
   
   /**
    * 获取交易日结算价
    * @return 交易日结算价
    */
   double            SessionPriceSettlement(void) const;
   
   /**
    * 获取交易日最低限价
    * @return 交易日最低限价
    */
   double            SessionPriceLimitMin(void) const;
   
   /**
    * 获取交易日最高限价
    * @return 交易日最高限价
    */
   double            SessionPriceLimitMax(void) const;
   
   /**
    * 获取整数型交易品种信息
    * @param prop_id 属性ID
    * @param var 输出值
    * @return 成功返回 true，失败返回 false
    */
   bool              InfoInteger(const ENUM_SYMBOL_INFO_INTEGER prop_id, long &var) const;
   
   /**
    * 获取浮点型交易品种信息
    * @param prop_id 属性ID
    * @param var 输出值
    * @return 成功返回 true，失败返回 false
    */
   bool              InfoDouble(const ENUM_SYMBOL_INFO_DOUBLE prop_id, double &var) const;
   
   /**
    * 获取字符串型交易品种信息
    * @param prop_id 属性ID
    * @param var 输出值
    * @return 成功返回 true，失败返回 false
    */
   bool              InfoString(const ENUM_SYMBOL_INFO_STRING prop_id, string &var) const;
   
   /**
    * 获取保证金率信息
    * @param order_type 订单类型
    * @param initial_margin_rate 初始保证金率
    * @param maintenance_margin_rate 维持保证金率
    * @return 成功返回 true，失败返回 false
    */
   bool              InfoMarginRate(const ENUM_ORDER_TYPE order_type, double &initial_margin_rate, double &maintenance_margin_rate) const;
   
   /**
    * 标准化价格
    * @param price 价格
    * @return 标准化后的价格
    */
   double            NormalizePrice(const double price) const;
   
   /**
    * 检查是否在市场中
    * @return 在市场返回 true，否则返回 false
    */
   bool              CheckMarketWatch(void);
};
//+------------------------------------------------------------------+